home *** CD-ROM | disk | FTP | other *** search
/ Tech Arsenal 1 / Tech Arsenal (Arsenal Computer).ISO / tek-02 / keep.zip / KEEP.PAS < prev    next >
Pascal/Delphi Source File  |  1991-12-19  |  11KB  |  483 lines

  1. program keep;
  2.  
  3. {-----------------------------------------------------------------------------
  4.  -                                                                           -
  5.  -  KEEP.PAS                                                                 -
  6.  -                                                                           -
  7.  -    Author: Rick Owen                                                      -
  8.  -    Date  : 12/17/91                                                       -
  9.  -    Keep:                                                                  -
  10.  -     1) parses the command line for file names (or file specs)             -
  11.  -     2) sets the hidden attribute on all files that match the              -
  12.  -        specification(s)                                                   -
  13.  -     3) deletes all other files in the directory, and                      -
  14.  -     4) resets the hidden attribute on the files that were prev-           -
  15.  -        iously hidden.                                                     -
  16.  -  These programs carry no warranties either expressed or implied.  I       -
  17.  -  assume no liability of any kind [use at YOUR risk].  Any program         -
  18.  -  which deletes files is inherently dangerous and you should be            -
  19.  -  extremely careful when using either KEEP or MASSDEL.  You are free to    -
  20.  -  use both programs however you wish, and you may freely distribute        -
  21.  -  copies of either program, as long as you do not charge for it [connect   -
  22.  -  charges to BBSes are excluded from this restriction].                    -
  23.  -----------------------------------------------------------------------------}
  24.  
  25. uses dos, crt;                                                         
  26.  
  27. const                                                                  
  28.  
  29.   MAXFILES  = 500;
  30.   MAXPARMS  = 50;
  31.   ReadOnly  = $01;
  32.   Hidden    = $02;
  33.   SysFile   = $04;
  34.   VolumeID  = $08;
  35.   Directory = $10;
  36.   Archive   = $20;
  37.  
  38. type
  39.  
  40.   miniSearchRec = record
  41.     time : longint;
  42.     size : longint;
  43.     name : string[12];
  44.   end; { record }
  45.   fileList    = array[1..MAXFILES] of miniSearchRec;
  46.  
  47. var
  48.   files       : fileList;
  49.   fileParms   : array[1..MAXPARMS] of String[12];
  50.   confirm     : boolean;
  51.   silent      : boolean;
  52.   fileCount   : word;
  53.   parmCount   : word;
  54.  
  55. procedure help;
  56.  
  57. begin { help }
  58.  
  59.   writeln('keep v1.0 - delete all files except those specified.');
  60.   writeln('usage: keep [-d] [-s] filespec1 [filespec2 ... filespecN]');
  61.   writeln('   -d = dangerous mode (no confirm)');
  62.   writeln('   -s = silent mode (no report as files are deleted)');
  63.   writeln('        defaults : confirm and not silent');
  64.   writeln;
  65.   writeln('Keep was written in Turbo Pascal V6.0 by Rick Owen');
  66.   writeln('Revision level = 0, Release date = 12/17/91.');
  67.   halt(1);
  68.  
  69. end { help };
  70.  
  71. procedure miniHelp;
  72.  
  73. begin { miniHelp }
  74.  
  75.   writeln;
  76.   writeln(' y - yes, delete file');
  77.   writeln(' n - no, do not delete file');
  78.   writeln(' q - no, do not delete file and terminate the program');
  79.   writeln(' c - yes, delete file and continue without further confirmation');
  80.   writeln(' l - list remaining files which will not be kept');
  81.   writeln(' k - list kept files');
  82.   writeln;
  83.  
  84. end; {miniHelp }
  85.  
  86. procedure getParameters;
  87.  
  88. var
  89.   parmLoop    : Word;
  90.   parm        : string[1];
  91.  
  92. begin { getParameters }
  93.  
  94.   if (ParamCount < 0) or (ParamCount > MAXPARMS) then
  95.   begin
  96.     help; { we don't return from help }
  97.   end
  98.   else
  99.   begin
  100.  
  101.     confirm   := true;
  102.     silent    := false;
  103.     parmCount := 1;
  104.  
  105.     for parmLoop := 1 to ParamCount do
  106.     begin
  107.       if copy(ParamStr(parmLoop),1,1) = '-' then
  108.       begin
  109.         { this is a parameter }
  110.         parm := copy(ParamStr(parmLoop),2,1);
  111.         if ((parm = 's') or (parm = 'S')) then
  112.           silent := true;
  113.         if ((parm = 'd') or (parm = 'D')) then
  114.           confirm := false;
  115.         if (pos(parm,'sSdD') = 0) then
  116.         begin
  117.           write('Unknown parameter - ignored');
  118.           writeln;
  119.         end
  120.       end
  121.       else
  122.       begin
  123.         fileParms[parmCount] := ParamStr(parmLoop);
  124.         inc(parmCount);
  125.       end
  126.     end; { loop }
  127.     dec(parmCount);
  128.     if parmCount = 0 then
  129.       help;
  130.   end; { for }
  131.  
  132. end; { getParameters }
  133.  
  134. function LeadingZero(w : Word) : String;
  135.  
  136. var
  137.   s : String;
  138.  
  139. begin { LeadingZero }
  140.  
  141.   Str(w:0,s);
  142.   if Length(s) = 1 then
  143.     s := '0' + s;
  144.   LeadingZero := s;
  145.  
  146. end; { LeadingZero }
  147.  
  148. function hideFile( fileName : string ) : word;
  149.  
  150.  
  151. var
  152.   f: file;
  153.  
  154. begin { hideFile }
  155.  
  156.   Assign(f, fileName);
  157.   SetFAttr(f, Hidden);
  158.   hideFile := DosError;
  159.  
  160. end; { hideFile }
  161.  
  162. procedure unHideFiles( files : fileList; lastFile : word);
  163.  
  164. var
  165.   f         : file;
  166.   attr      : Word;
  167.   fileLoop  : word;
  168.  
  169. begin
  170.  
  171.   for fileLoop := 1 to lastFile do
  172.   begin
  173.  
  174.     Assign(f, files[fileLoop].name);
  175.     GetFAttr(f, attr);
  176.  
  177.     if attr and Hidden <> 0 then
  178.     begin
  179.  
  180.       attr := attr xor Hidden;
  181.       SetFAttr(f, attr);
  182.  
  183.     end;
  184.  
  185.   end; { for }
  186.  
  187. end; { unHideFiles }
  188.  
  189. procedure writeFileData( dta : miniSearchRec );
  190.  
  191. var
  192.   dt        : DateTime;
  193.  
  194. begin { writeFileData }
  195.  
  196.     write(dta.name:12);
  197.     write(dta.size:8);
  198.     write(' ');
  199.     UnpackTime(dta.time,dt);
  200.     with dt do
  201.     begin
  202.       Write(' ',LeadingZero(day), '/',LeadingZero(month),'/',
  203.             LeadingZero(year));
  204.       Write(' ', LeadingZero(hour),':',
  205.             LeadingZero(min),':', LeadingZero(sec));
  206.       Write(' ');
  207.     end;
  208.  
  209. end; { writeFileData }
  210.  
  211. procedure listRemainingFiles( dta : SearchRec );
  212.  
  213. var
  214.   t           : SearchRec;
  215.   x           : miniSearchRec;
  216.   lineCount   : word;
  217.   ch          : Char;
  218.  
  219. begin { listRemainingFiles }
  220.  
  221.   move(dta, t, SizeOf(t));
  222.  
  223.   writeln;
  224.   lineCount := 2;
  225.   writeln('───────────── Start of List ─────────────');
  226.  
  227.   repeat
  228.  
  229.  
  230.     move(t.name, x.name, SizeOf(dta.name));
  231.     x.size := t.size;
  232.     x.time := t.time;
  233.     writeFileData( x );
  234.     writeln;
  235.     inc(lineCount);
  236.     if lineCount > 24 then
  237.     begin
  238.       write('───────── pausing - press a key ─────────');
  239.       ch := readKey;
  240.       writeln;
  241.       lineCount := 1;
  242.     end;
  243.     findNext( t );
  244.  
  245.   until DosError <> 0;
  246.  
  247.   writeln('────────────── End of List ──────────────');
  248.  
  249. end; { listRemainingFiles }
  250.  
  251. procedure listKeptFiles;
  252.  
  253. var
  254.   lineCount   : word;
  255.   ch          : Char;
  256.   fileLoop    : word;
  257.  
  258. begin { listKeptFiles }
  259.  
  260.  
  261.   writeln;
  262.   lineCount := 2;
  263.   writeln('───────────── Start of List ─────────────');
  264.  
  265.   for fileLoop := 1 to fileCount do
  266.   begin
  267.  
  268.     writeFileData( files[fileLoop] );
  269.     writeln;
  270.     inc(lineCount);
  271.     if lineCount > 24 then
  272.     begin
  273.       write('───────── pausing - press a key ─────────');
  274.       ch := readKey;
  275.       writeln;
  276.       lineCount := 1;
  277.     end;
  278.  
  279.   end; { for }
  280.  
  281.   writeln('────────────── End of List ──────────────');
  282.  
  283. end; { listKeptFiles }
  284.  
  285. procedure writePrompt;
  286. begin { writePrompt }
  287.   Write(' : delete (y/N/q/c/l/k/?) ');
  288. end; { writePrompt }
  289.  
  290. procedure deleteTheFiles;
  291.  
  292. var
  293.   fileLoop    : Word;
  294.   dta         : SearchRec;
  295.   listDta     : miniSearchRec;
  296.   dt          : DateTime;
  297.   confirmKey  : char;
  298.   doExit      : boolean;
  299.   doStop      : boolean;
  300.   deleteIt    : boolean;
  301.   f           : file;
  302.  
  303. begin { deleteTheFiles }
  304.  
  305.   fileCount := 1;
  306.  
  307.   for fileLoop := 1 to parmCount do
  308.   begin
  309.  
  310.     findfirst(fileParms[fileLoop], Archive, dta);
  311.     while DosError = 0 do
  312.     begin
  313.  
  314.       move(dta.name, files[fileCount].name, SizeOf(dta.name));
  315.       files[fileCount].size := dta.size;
  316.       files[fileCount].time := dta.time;
  317.  
  318.       if hideFile(dta.name) > 0 then
  319.       begin
  320.         writeln('Error while hiding files');
  321.         unHideFiles(files, fileCount - 1);
  322.         halt(3);
  323.       end;
  324.       inc(fileCount);
  325.       if fileCount > MAXFILES then
  326.       begin
  327.         writeln('Maximum number of files exceeded!');
  328.         unHideFiles(files, fileCount - 1);
  329.         halt(2);
  330.       end;
  331.  
  332.       findnext(dta);
  333.  
  334.     end; { while }
  335.  
  336.   end; { for }
  337.  
  338.   dec(fileCount);
  339.  
  340.   if fileCount = 0 then
  341.   begin
  342.  
  343.     Write('No files found matching keep parameters.  Delete ALL files (y/N) ?');
  344.     doExit := true;
  345.     doStop := true;
  346.  
  347.     repeat
  348.  
  349.         confirmKey := upcase(readkey);
  350.  
  351.         case confirmKey of
  352.  
  353.           'Y'     : begin
  354.                     doExit := true;
  355.                     doStop := false
  356.                   end;
  357.           'N',#13, 'Q', #27
  358.                 : begin
  359.                     doExit := true;
  360.                     doStop := true;
  361.                   end;
  362.  
  363.         end; { case }
  364.  
  365.       until doExit;
  366.  
  367.     if doStop then
  368.       halt(4);
  369.  
  370.     writeln;
  371.  
  372.   end;
  373.  
  374.  
  375.   { now we delete all those that remain }
  376.  
  377.   findfirst('*.*', Archive, dta);
  378.   while DosError = 0 do
  379.   begin
  380.     deleteIt := true;
  381.     doStop   := false;
  382.       if confirm then
  383.       begin
  384.       deleteIt := false;
  385.         doExit := false;
  386.  
  387.       move(dta.name, listDta.name, SizeOf(dta.name));
  388.       listDta.size := dta.size;
  389.       listDta.time := dta.time;
  390.       writeFileData( listDta );
  391.       writePrompt;
  392.  
  393.         repeat
  394.  
  395.           confirmKey := upcase(readkey);
  396.  
  397.           case confirmKey of
  398.             'Y'     : begin
  399.                       deleteIt := true;
  400.                       doExit   := true
  401.                     end;
  402.             'N',#13 : doExit := true;
  403.             'Q',#27 : begin
  404.                       doExit := true;
  405.                       doStop := true;
  406.                     end;
  407.           'L'     : begin
  408.                       listRemainingFiles( dta );
  409.                       writeFileData( listDta );
  410.                       writePrompt;
  411.                     end;
  412.           'K'     : begin
  413.                       listKeptFiles;
  414.                       writeFileData( listDta );
  415.                       writePrompt;
  416.                     end;
  417.             'C'     : begin
  418.                         doExit   := true;
  419.                       deleteIt := true;
  420.                         confirm  := false
  421.                       end;
  422.             '?'     : begin
  423.                       miniHelp;
  424.                       writeFileData( listDta );
  425.                       writePrompt;
  426.                     end;
  427.  
  428.           else      doExit := false;
  429.  
  430.           end; { case }
  431.  
  432.         until doExit;
  433.       writeln;
  434.       end;
  435.  
  436.     if doStop then
  437.     begin
  438.  
  439.       unHideFiles(files, fileCount);
  440.       halt(5);
  441.  
  442.     end;
  443.  
  444.     if deleteIt then
  445.     begin
  446.  
  447.       Assign(f, dta.name);
  448.       {$I-}
  449.       Reset(f);
  450.       {$I+}
  451.       if IOResult <> 0 then
  452.       begin
  453.         WriteLn('Cannot find ', dta.name);
  454.         unHideFiles(files, fileCount);
  455.         halt(6);
  456.       end
  457.       else
  458.       begin
  459.         Close(f);
  460.         if not silent then
  461.           writeln('  deleting ', dta.name);
  462.        Erase(f);
  463.       end;
  464.  
  465.     end;
  466.  
  467.     findnext(dta);
  468.  
  469.   end; { while }
  470.  
  471.   unHideFiles(files, fileCount);
  472.  
  473. end { deleteTheFiles } ;
  474.  
  475. begin { keep }
  476.  
  477.   CheckBreak := false;
  478.   getParameters;
  479.   deleteTheFiles;
  480.  
  481. end { keep }.
  482.  
  483.